iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 27
1
自我挑戰組

Android 菜鳥村-開發基礎 30篇系列 第 29

[Day 27] RecyclerView 下 - itmetouchhelper

  • 分享至 

  • xImage
  •  

重要 method

  • onSwiped(ViewHolder, int)

當產生側滑效果了,會回調此方法。

我們在這個方法裡面從數據源里面移除相應的數據,然後調用notifyXXX方法就行了。

      
          override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
              val position = viewHolder.getAdapterPosition()
              
              //放在Adapter的函式removeItem()
              
              this_adapter.removeItem(position)
            }
      

具體 removeItem function

      
          fun removeItem(position: Int){

          innerList.removeAt(position)

          notifyDataSetChanged()

        }
  • onMove(RecyclerView, ViewHolder, ViewHolder)

當產生拖動效果了,會回調此方法。

我們通常會更新數據源,就比如說,一個ItemView從0拖到了1位置,那麼對應的數據源也需要更改位置

     override fun onMove(
     recyclerView: RecyclerView,
     viewHolder: RecyclerView.ViewHolder,
     target: RecyclerView.ViewHolder
     ): Boolean {

     val fromPos = viewHolder.getAdapterPosition()

     val toPos = target.getAdapterPosition()
     
     // move item in `fromPos` to `toPos` in adapter.
     
     //放在Adapter的函式moveItem()

     this_adapter.moveItem(fromPos,toPos)

     return true  // true if moved, false otherwise
     }
     

具體 moveItem method

如果只有畫面上做變動,當資料重新bind 時 還是會依據這個位子的資料 去 bind 畫面, 回復原來的樣子

      
      fun moveItem(fromPos:Int,toPos:Int){

       // 資料做變動

       val origin = innerList[fromPos]

       innerList.removeAt(fromPos)

       innerList.add(toPos,origin)

       // 畫面上做變動

       notifyItemMoved(fromPos, toPos)

    }
      
  • getMovementFlags(RecyclerView, ViewHolder)

    我們需要複寫getMovementFlags()去指定允許滑動的方向,使用 makeMovementFlags(int,int)建立returned flags。

    如下:

     override fun getMovementFlags(
     recyclerView: RecyclerView,
    
     viewHolder: RecyclerView.ViewHolder): Int {
    
     // 這裡drag支持上下方向,swipe支持左右方向。
    
     val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
    
     val swipeFlags = ItemTouchHelper.START or ItemTouchHelper.END
    
     return makeMovementFlags(dragFlags,swipeFlags)}
    
  • isItemViewSwipeEnabled()

    是否可以左右側滑,默認返回true

      
         override fun isItemViewSwipeEnabled(): Boolean {

                return true

            }
      
  • isLongPressDragEnabled()

    是否可以長按上下拖拽,默認返回false

          override fun isLongPressDragEnabled(): Boolean {

                return true

            }
      

在 Acivity 中將 ItemTouchHelper 和 RecyclerView 關聯起來



itemTouchHelper.attachToRecyclerView(recyclerview)



上一篇
[Day 26] RecyclerView 上
下一篇
[Day 28] Android SharePreference
系列文
Android 菜鳥村-開發基礎 30篇32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言